#ifndef xpack_macro_xforward
#define xpack_macro_xforward
#pragma push_macro("xuser")
#undef  xuser
#define xuser mixc::macro_xforward::inc
#include"define/base_type.hpp"
#include"meta/is_left_ref.hpp"
#include"meta/origin_of.hpp"
#include"meta/remove_ref.hpp"
#pragma pop_macro("xuser")

namespace mixc::macro_xforward{
    template<class expect_t, class type_t>
    struct meta{
        using expect    = expect_t &&;
        using type      = inc::origin_of<type_t> &&;
    };

    template<class expect_t, inc::is_left_ref type_t>
    struct meta<expect_t, type_t>{
        using expect    = expect_t &;
        using type      = type_t;
    };

    template<class expect_t, class type_t>
    using forward       = typename meta<inc::remove_ref<expect_t>, type_t>::expect;
}

#define xforward(VALUE)     ::mixc::macro_xforward::forward<decltype(VALUE), decltype(VALUE) &&>(VALUE)

// 废弃：
// xforward(TYPE,VALUE)
// 比如 VALUE 的类型是 char &，如果 type 传入 int，
// 那么 VALUE 将会转成 int &，导致在访问该值的时候会多操作 3 个字节（假设 int 为 4 字节）
// 此外新的写法不仅可以避免误用，而且还简化了参数
#endif
